package com.runvp.common.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @ClassName: BigDecimalUtil
 * @description: 浮点工具类
 * @author: kangkang.xu
 * @date: Created in 17:22 2019/5/22
 * @Version: 1.0
 **/
public class BigDecimalUtil {

    private static final int DEF_DIV_SCALE = 10;

    /**
     * 两位小数
     */
    private static final Integer TEO = 2;

    private BigDecimalUtil(){}

    /**
     * 精准的加法运算
     * @param v1
     * @param v2
     * @return double
     */
    public static double add(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.add(b2).doubleValue();
    }
    /**
     * 精准的加法运算
     * @param b1
     * @param b2
     * @return double
     */
    public static BigDecimal add(BigDecimal b1,BigDecimal b2){
        return b1.add(b2).setScale(TEO, RoundingMode.DOWN);
    }
    /**
     * 精确减法计算
     * @param v1
     * @param v2
     * @return double
     */
    public static double sub(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.subtract(b2).doubleValue();
    }
    /**
     * 精确减法计算
     * @param b1
     * @param b2
     * @return double
     */
    public static BigDecimal sub(BigDecimal b1 ,BigDecimal b2){
        return b1.subtract(b2).setScale(TEO, RoundingMode.DOWN);
    }
    /**
     * 精确乘法计算
     * @param v1
     * @param v2
     * @return double
     */
    public static double mul(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.multiply(b2).doubleValue();
    }
    /**
     * 精确乘法计算
     * @param b1
     * @param b2
     * @return BigDecimal
     */
    public static BigDecimal mul(BigDecimal b1,BigDecimal b2){
        return b1.multiply(b2).setScale(TEO, RoundingMode.DOWN);
    }
    /**
     * 精确除法计算
     * @param b1
     * @param b2
     * @return double
     */
    public static BigDecimal div(BigDecimal b1,BigDecimal b2){
        return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_DOWN).setScale(TEO, RoundingMode.DOWN);
    }
    /**
     * 精确除法计算
     * @param v1
     * @param v2
     * @return double
     */
    public static BigDecimal div(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_DOWN).setScale(TEO, RoundingMode.HALF_DOWN);
    }
    /**
     * 转换类型
     * @param object
     * @return BigDecimal
     */
    public static BigDecimal vf(Object object){
        if(null == object){
            return BigDecimal.ZERO;
        }
        try{
            return new BigDecimal(ToolUtils.toStr(object));
        }catch (Exception e){
            e.printStackTrace();
            return BigDecimal.ZERO;
        }
    }
    public static void main(String[] args) {
        double d1 = 12.897;
        double d2 = 3.87;
        System.out.println(BigDecimalUtil.add(d1,d2));
        System.out.println(BigDecimalUtil.sub(d1, d2));
        System.out.println(BigDecimalUtil.mul(d1, d2));
        System.out.println(BigDecimalUtil.div(vf("5"), new BigDecimal("3")));
        System.out.println(BigDecimalUtil.mul(vf("5"), new BigDecimal("3.51")));

    }
}
